home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / VObjectTView.C < prev    next >
C/C++ Source or Header  |  1992-08-26  |  9KB  |  376 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "VObjectTView.h"
  6.  
  7. #include "Class.h"
  8. #include "VObjectText.h"
  9. #include "Clipper.h"
  10. #include "Picture.h"
  11. #include "PictureItem.h"
  12. #include "ImageItem.h"
  13. #include "Data.h"
  14.  
  15. //----- VObjectTextView ---------------------------------------------------
  16.  
  17. NewMetaImpl0(VObjectTextView, TextView);
  18.  
  19. VObjectTextView::VObjectTextView(
  20.     EvtHandler *eh, Rectangle r, VObjectText *t, 
  21.     bool w, TextViewFlags f, Point b, 
  22.     TViewAlign ta, int id
  23. ): TextView(eh, r, t, w, f, b, ta, id) 
  24. {
  25.     t->SetView(this);
  26.     SetFlag(eVObjKbdFocus);
  27. }
  28.  
  29. VObjectTextView::~VObjectTextView()
  30. {
  31.     if (GetText() != 0)
  32.     Guard(GetText(), VObjectText)->SetView(0);
  33. }
  34.  
  35. Command *VObjectTextView::DispatchEvents(Point lp, Token &t, Clipper *vf) 
  36. {
  37.     if (t.IsKey() || t.IsFunctionKey() || t.IsCursorKey())
  38.     return TextView::DispatchEvents(lp, t, vf);
  39.  
  40.     VisualMark *vmp= IsInputForVisualMark(lp);
  41.     if (vmp)
  42.     return vmp->Input(lp, t, vf);
  43.     return TextView::DispatchEvents(lp, t, vf);
  44. }
  45.  
  46. GrCursor VObjectTextView::GetCursor(Point lp)
  47. {
  48.     if (IsInputForVisualMark(lp))
  49.     return eCrsBoldArrow;
  50.     return TextView::GetCursor(lp);
  51. }
  52.  
  53. void VObjectTextView::Control(int id, int part, void *val)
  54. {
  55.     if (part == cPartExtentChanged) 
  56.     ((VObjectText*)GetText())->VObjectChangedSize((VObject*)val);
  57.     else
  58.     TextView::Control(id, part, val);
  59. }
  60.  
  61. bool VObjectTextView::CanPaste(Data *data)
  62. {
  63.     if (data->FindConvertersFor(Meta(VObject), Meta(Picture), Meta(Bitmap)))
  64.     return TRUE;
  65.     if (TextView::CanPaste(data))
  66.     return TRUE;
  67.     return FALSE;
  68. }
  69.  
  70. Command *VObjectTextView::PasteData(Data *data)
  71. {
  72.     Object *op;
  73.     
  74.     if (op= data->AsObject(Meta(Picture)))
  75.     return new PasteVObjectCommand(this, new PictureItem((Picture*)op));
  76.     
  77.     if (op= data->AsObject(Meta(Bitmap)))
  78.     return new PasteVObjectCommand(this, new ImageItem((Bitmap*)op));
  79.  
  80.     if (op= data->AsObject(Meta(VObject)))
  81.     return new PasteVObjectCommand(this, (VObject*)op);
  82.  
  83.     return TextView::PasteData(data);
  84. }
  85.  
  86. void VObjectTextView::PasteVObject(VObject *vop)
  87. {
  88.     if (!Writeable())
  89.     return;
  90.     if ((!Caret() && !DeleteRequest(start.ch, end.ch)) || !AnySelection())
  91.     return;
  92.     PasteVisualMark(new VObjectMark(vop));
  93. }
  94.  
  95. void VObjectTextView::PasteVisualMark(VisualMark *vmp)
  96. {
  97.     if (!Writeable())
  98.     return;
  99.     if ((!Caret() && !DeleteRequest(start.ch, end.ch)) || !AnySelection())
  100.     return;
  101.     updateSelection= FALSE;
  102.     Guard(text, VObjectText)->PasteVisualMark(vmp, start.ch, end.ch);
  103.     updateSelection= TRUE;
  104.     PrivSetSelection(start.ch+1, start.ch+1, FALSE);       
  105. }
  106.  
  107. void VObjectTextView::SetOrigin(Point p)
  108. {
  109.      if (p != GetOrigin()) 
  110.     TextView::SetOrigin(p);
  111. }
  112.  
  113. IStream& VObjectTextView::ReadFrom(IStream &s)
  114. {
  115.     TextView::ReadFrom(s);
  116.     ((VObjectText*)GetText())->SetView(this);
  117.     return s;
  118. }
  119.  
  120. Text *VObjectTextView::SetText(Text *newText, bool)
  121. {
  122.     Text *ot= TextView::SetText(newText);
  123.     if (newText->IsKindOf(VObjectText))
  124.     ((VObjectText*)newText)->SetView(this);
  125.     else
  126.     Error("SetText", "only accepts VObjectTexts");
  127.     return ot;
  128. }
  129.  
  130. VisualMark *VObjectTextView::IsInputForVisualMark(Point p)
  131. {
  132.     VObjectText *vt= (VObjectText*)GetText();
  133.     int line, ch;
  134.     Point vp;
  135.     PointToPoint(p, &vp, &line, &ch, FALSE);
  136.     VisualMark *vmp= vt->GetVisualMarkAt(ch);
  137.     if (vmp && p.x > vp.x)
  138.         return vmp;
  139.     if (ch > 0) {
  140.         vmp= vt->GetVisualMarkAt(ch-1);
  141.         if (vmp && p.x < vp.x)
  142.             return vmp;
  143.     }
  144.     return 0;
  145. }
  146.  
  147. //---- PasteVObjectCommand ----------------------------------------------------
  148.  
  149. NewMetaImpl(PasteVObjectCommand, TextCommand, (TP(vmp), T(newStart), T(newEnd)));
  150.  
  151. PasteVObjectCommand::PasteVObjectCommand(
  152.     VObjectTextView *tv, VObject *v, int cmdNo, char *cmdName
  153. ) : TextCommand(tv, cmdNo, cmdName ? cmdName : "Paste Graphic")
  154. {
  155.     vmp= new VObjectMark(v);
  156.     vtv= tv;
  157.     vt= 0;
  158. }
  159.  
  160. PasteVObjectCommand::PasteVObjectCommand(
  161.     VObjectTextView *tv, VisualMark *v, int cmdNo, char *cmdName
  162. ) : TextCommand(tv, cmdNo, cmdName ? cmdName : "Paste Graphic")
  163. {
  164.     vmp= v;
  165.     vtv= tv;
  166.     vt= 0;
  167. }
  168.  
  169. PasteVObjectCommand::~PasteVObjectCommand()
  170. {
  171. }
  172.  
  173. void PasteVObjectCommand::DoIt()
  174. {
  175.     vtv->PasteVisualMark(vmp);
  176.     tv->GetSelection(&newStart, &newEnd);
  177.     tv->RevealSelection();
  178. }  
  179.  
  180. void PasteVObjectCommand::UndoIt()
  181. {
  182.     tv->SetSelection(oldStart, newEnd, FALSE);
  183.     if (vt == 0) {
  184.     vt= new VObjectText;
  185.     tv->GetText()->Copy(vt, oldStart, newEnd);
  186.     }
  187.     tv->Cut();
  188.     if (oldText->End() != 0)
  189.     tv->Paste(oldText);
  190.     RestoreSelection();
  191.     tv->RevealSelection();
  192. }
  193.  
  194. void PasteVObjectCommand::RedoIt()
  195. {
  196.     RestoreSelection();
  197.     tv->Paste(vt);
  198.     tv->RevealSelection();
  199. }
  200.  
  201. //---- StretchWrapperStretcher ------------------------------------------------
  202.  
  203. class StretchWrapperStretcher: public Command {
  204.     Point newExtent, oldExtent;
  205.     class VObject *vob;
  206.     Rectangle maxRect;
  207. public:
  208.     StretchWrapperStretcher(VObject *v);
  209.     Command *TrackMouse(TrackPhase, Point, Point, Point);
  210.     void TrackFeedback(Point ap, Point pp, bool);
  211.     void TrackConstrain(Point, Point, Point *);
  212.     void DoIt();
  213.     void UndoIt();
  214. };
  215.  
  216. StretchWrapperStretcher::StretchWrapperStretcher(VObject *v) : Command(1212, "Change Extent")
  217. {
  218.     vob= v;
  219.     View *vp= vob->GetView();
  220.     if (vp->IsKindOf(StaticTextView)) {
  221.     StaticTextView *stv= (StaticTextView*)vp;
  222.     maxRect= Rectangle(stv->GetInnerOrigin(), stv->GetInnerExtent());
  223.     } else
  224.     maxRect= vob->GetView()->ContentRect();
  225. }
  226.  
  227. Command *StretchWrapperStretcher::TrackMouse(TrackPhase tp, Point, Point, Point np)
  228. {
  229.     if (tp == eTrackRelease) {
  230.     newExtent= np - vob->GetOrigin();
  231.     oldExtent= vob->GetExtent();
  232.     if (oldExtent == newExtent)
  233.         return gNoChanges;
  234.     return this;
  235.     }
  236.     return this;
  237. }
  238.  
  239. void StretchWrapperStretcher::TrackFeedback(Point, Point pp, bool)
  240. {
  241.     GrStrokeRect(NormRect(vob->GetOrigin(), pp));
  242. }
  243.  
  244. void StretchWrapperStretcher::TrackConstrain(Point, Point, Point *np)
  245. {    
  246.     *np= Max(vob->GetOrigin()+ vob->GetMinSize().Extent(), *np);
  247.     *np= NormRect(vob->GetOrigin(), *np).Intersect(maxRect).SE();
  248. }
  249.  
  250. void StretchWrapperStretcher::DoIt()
  251. {
  252.     vob->SetExtent(newExtent);
  253. }
  254.  
  255. void StretchWrapperStretcher::UndoIt()
  256. {
  257.     vob->SetExtent(oldExtent);
  258. }
  259.  
  260. //---- StretchWrapper ----------------------------------------------------------
  261.  
  262. NewMetaImpl(StretchWrapper,CompositeVObject, (T(interiorOffset), T(extentDiff),
  263.                             T(border), TP(interior)));
  264.  
  265. StretchWrapper::StretchWrapper(VObject *in, Point b, int id) 
  266.                         : CompositeVObject(id, in, 0)
  267. {
  268.     SetFlag(eVObjKbdFocus);
  269.     interior= in;
  270.     if (interior->IsKindOf(View))
  271.     ((View*)interior)->SetNextHandler(this);
  272.     border= Max(Point(4,4),b);
  273. }
  274.  
  275. Metric StretchWrapper::GetMinSize()
  276. {
  277.     interiorOffset= border;
  278.     extentDiff= 2*interiorOffset;
  279.     Metric m= interior->GetMinSize();
  280.     return m.Expand(border);
  281. }
  282.  
  283. void StretchWrapper::SetOrigin(Point at)
  284. {
  285.     VObject::SetOrigin(at);
  286.     interior->SetOrigin(at+interiorOffset);
  287. }
  288.  
  289. void StretchWrapper::SetExtent(Point e)
  290. {
  291.     VObject::SetExtent(e);
  292.     interior->SetExtent(e-extentDiff);
  293. }
  294.  
  295. Command *StretchWrapper::DoLeftButtonDownCommand(Point p, Token, int)
  296. {
  297.     Rectangle r(ContentRect().SE()-gPoint8, gPoint8);
  298.     
  299.     if (r.ContainsPoint(p)) 
  300.     return new StretchWrapperStretcher(this);
  301.     return gNoChanges;
  302. }
  303.  
  304. Command *StretchWrapper::DoKeyCommand(int, Token)
  305. {
  306.     return gNoChanges;
  307. }
  308.  
  309. void StretchWrapper::Control(int id, int part, void *val)
  310. {
  311.     if (part == cPartExtentChanged && val == interior) {
  312.     VObject *vop= (VObject*)val;
  313.     if (interior->GetExtent() != GetExtent()+extentDiff) // change from inside
  314.         SetExtent(interior->GetExtent()+extentDiff);
  315.     SetOrigin(GetOrigin());
  316.     VObject::Control(id, part, this);         // change from outside
  317.     return;
  318.     }
  319.     VObject::Control(id, part, val);
  320. }
  321.  
  322. void StretchWrapper::SendDown(int id, int part, void *val)
  323. {
  324.     switch (part) {
  325.     case cPartEnableLayoutCntl:
  326.     interior->SetFlag(eVObjLayoutCntl);
  327.     break;
  328.     default:
  329.     CompositeVObject::SendDown(id, part, val);
  330.     break;
  331.     }    
  332. }
  333.  
  334. bool StretchWrapper::KbdFocus(bool in)
  335. {
  336.     bool b= interior->KbdFocus(in);
  337.     ForceRedraw();
  338.     return b;
  339. }
  340.  
  341. void StretchWrapper::Draw(Rectangle r)
  342. {
  343.     CompositeVObject::Draw(r);
  344.     if (gFirstHandler == this) {
  345.     GrSetPenNormal();
  346.     GrSetPenInk(ePatGrey50);
  347.     GrSetPenSize(2);
  348.     GrStrokeRect(ContentRect());
  349.     GrPaintRect(Rectangle(ContentRect().SE()-gPoint4, gPoint4), ePatBlack);
  350.     }
  351. }
  352.  
  353. GrCursor StretchWrapper::GetCursor(Point p)
  354. {
  355.     Rectangle r(ContentRect().SE()-gPoint8, gPoint8);
  356.     
  357.     if (r.ContainsPoint(p)) 
  358.     return eCrsMoveStretch;
  359.     return VObject::GetCursor(p);
  360. }
  361.  
  362. OStream& StretchWrapper::PrintOn(OStream &s)
  363. {
  364.     CompositeVObject::PrintOn(s);
  365.     return s << border SP << interiorOffset SP << extentDiff SP << interior SP;
  366. }
  367.  
  368. IStream& StretchWrapper::ReadFrom(IStream &s)
  369. {
  370.     CompositeVObject::ReadFrom(s);
  371.     s >> border >> interiorOffset >> extentDiff >> interior;
  372.     if (interior->IsKindOf(View))
  373.     ((View*)interior)->SetNextHandler(this);
  374.     return s;
  375. }
  376.